﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using produccion.vistamodelo;
using System.ComponentModel;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMmanclien.xaml
    /// </summary>
    public partial class FRMmanclien : Window
    {
        manclien _manclien;

        public FRMmanclien()
        {
            InitializeComponent();
            _manclien = (manclien)this.DataContext;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _manclien.listaCliente();
            limpiar();

            if (_manclien.lisFilCli.Count > 0)
            {
                dataGrid1.SelectedIndex = 0;
            }
            texCod.Focus();
            texCod.Select(0, 0);

        }

        private void limpiar()
        {
            texCod.Text = "";
            texNom.Text = "";
            radPri.IsChecked = false;
            radSec.IsChecked = false;
            comCli.SelectedValue = "";
            texNit.Text = "";
            texTel1.Text = "";
            texTel2.Text = "";
            texFax.Text = "";
            texDir.Text = "";
            comCiu.SelectedValue = "";
            texRep.Text = "";
            texCon.Text = "";
            texEma.Text = "";
            comLis.SelectedValue = "";
            comLisRep.SelectedValue = "";
            txtDescuento.Text = "0";
            texPla.Text = "0";
            radSec.IsChecked = false;
            radAct.IsChecked = true;
            cheApl.IsChecked = false;
            cheCliCom.IsChecked = false;
            cheCliInt.IsChecked = true;
            
            _manclien.txtCliente.CAMBIO = false;
        }

        string camb;
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {
            if (_manclien.txtCliente.CODCLI_CLI != camb)
            {
                //if (_manclien.txtCliente.CAMBIO && _manclien.txtCliente.CODCLI_CLI.Length==0)
                //{
                //    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                //    {
                //        _manclien.txtCliente.CODCLI_CLI = camb;
                //        return;
                //    }
                //    _manclien.txtCliente.CAMBIO = false;
                //}
                camb = _manclien.txtCliente.CODCLI_CLI;
                _manclien.txtCliente.consultar();
                if (!_manclien.txtCliente.EXISTE)
                {
                    texNom.Text = "";
                    radPri.IsChecked = false;
                    radSec.IsChecked = false;
                    comCli.SelectedValue = "";
                    texNit.Text = "";
                    texTel1.Text = "";
                    texTel2.Text = "";
                    texFax.Text = "";
                    texDir.Text = "";
                    comCiu.SelectedValue = "";
                    texRep.Text = "";
                    texCon.Text = "";
                    texEma.Text = "";
                    comLis.SelectedValue = "";
                    comLisRep.SelectedValue = "";
                    txtDescuento.Text = "";
                    texPla.Text = "";
                    radSec.IsChecked = false;
                    radAct.IsChecked = false;
                    cheApl.IsChecked = false;
                    cheCliCom.IsChecked = false;
                    cheCliInt.IsChecked = false;
                    _manclien.txtCliente.CAMBIO = false;
                }
                if (radPri.IsChecked == true)
                {
                    comCli.SelectedValue = texCod.Text;
                    txtDescuento.Text = "0";
                    texPla.Text = "0";
                    radAct.IsChecked = true;
                    cheCliInt.IsChecked = true;
                }
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (_manclien.txtCliente.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else
                {
                    _manclien.txtCliente.CAMBIO = false;
                }
            }
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            if (_manclien.txtCliente.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea crear un nuevo elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                {
                    return;
                }
                _manclien.txtCliente.CAMBIO = false;
            }
            limpiar();
            
            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void butEli_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("¿Esta seguro que desea eliminar el elemento?", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
            {
                return;
            }
            _manclien.eliminar(wPnot);
            limpiar();
            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            string StrDatoFaltante = PrivStr_ValidarDatos();
            if (StrDatoFaltante == "")
            {
                _manclien.guardar(wPnot);
                texCod.Focus();
                texCod.Select(0, 0);
            }
            else
            {
                MessageBoxResult result = MessageBox.Show(this, StrDatoFaltante, "PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private string PrivStr_ValidarDatos()
        {
            string StrDatoDevuelto = "";
            if (comCli.SelectedValue == null)
            {
                if (radPri.IsChecked == true)
                {
                    
                }
                else
                {
                    StrDatoDevuelto = "Falta seleccionar el cliente";
                }
            }
            if (comCiu.SelectedValue == null)
            {
                StrDatoDevuelto = "Falta seleccionar la ciudad";
            }
            if (texEma.Text == "")
            {
                StrDatoDevuelto = "Falta digitar el Email";
            }
            return StrDatoDevuelto;
        }
        private void cm_Closed(object sender, RoutedEventArgs e)
        {
            _manclien.filtrar();
        }

        private void cc_Closed(object sender, RoutedEventArgs e)
        {
            _manclien.filtrar();
        }

        private void quiFil_Click(object sender, RoutedEventArgs e)
        {
            _manclien.quiFil();
        }

        private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (_manclien.txtCliente.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    return;
                }
                _manclien.txtCliente.CAMBIO = false;
            }
            if (_manclien.selCliente != null)
            {
                _manclien.txtCliente.CODCLI_CLI = _manclien.selCliente.CODCLI_CLI;
                _manclien.txtCliente.EXISTE = true;
            }
        }

        private void radPri_Checked(object sender, RoutedEventArgs e)
        {
            _manclien.txtCliente.CLIPPAL_CLI = _manclien.txtCliente.CODCLI_CLI;
        }

        private void radSec_Checked(object sender, RoutedEventArgs e)
        {
            _manclien.txtCliente.CLIPPAL_CLI = "";
            comCli.SelectedValue = "";
        }

        private void butConCli_Click(object sender, RoutedEventArgs e)
        {
            _manclien.consCliente();
            texCod.Focus();
            texCod.Select(0, 0);
        }

        private void dataGrid1_PreviewKeyUp(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

    }

    internal class manclien : ObservableObject
    {

        #region propiedades

        //-----------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private VMbuscarGeneral _buscarCliente;
        public VMbuscarGeneral buscarCliente
        {
            get { return _buscarCliente; }
            set { _buscarCliente = value; RaisePropertyChangedEvent("buscarCliente"); }
        }

        //Objeto para los campos de edicion del formulario
        private clases.CLSMAECLIP _txtCliente = new clases.CLSMAECLIP();
        public clases.CLSMAECLIP txtCliente
        {
            get { return _txtCliente; }
            set { _txtCliente = value; RaisePropertyChangedEvent("txtCliente");  }
        }

        //Objeto para los filtros del DataGrid
        private clases.CLSMAECLIP _filCliente = new clases.CLSMAECLIP
        {
            CODCLI_CLI = "",
            NOMCLI_CLI = "",
            NOMREP_CLI = "",
            CONTAC_CLI = "",
            DIRCLI_CLI = "",
            CODCIU_CLI = "",
            NITCLI_CLI = "",
            TEL1CLI_CLI = "",
            TEL2CLI_CLI = "",
            FAXCLI_CLI = "",
            PLAZO_CLI = "",
            APLRTE_CLI = "",
            TIPO_CLI = "",
            CODLIS_CLI = "",
            CODLISREP_CLI = "",
            EMAIL_CLI = "",
            CLIPPAL_CLI = "",
            ESTADO_CLI = "",
            DCTCLI_CLI = 0,
            CLICOM_CLI = "",
            CLIINTERNO_CLI = ""
        };
        public clases.CLSMAECLIP filCliente
        {
            get { return _filCliente; }
            set { _filCliente = value; RaisePropertyChangedEvent("filCliente"); }
        }

        //Objeto para una seleccion del DataGrid
        private clases.CLSMAECLIP _selCliente = new clases.CLSMAECLIP();
        public clases.CLSMAECLIP selCliente
        {
            get { return _selCliente; }
            set { _selCliente = value; RaisePropertyChangedEvent("selCliente"); }
        }

        //Objeto para lista de clientes 
        private List<clases.CLSMAECLIP> _lisCliente = new List<clases.CLSMAECLIP>();
        public List<clases.CLSMAECLIP> lisCliente
        {
            get { return _lisCliente; }
            set { _lisCliente = value; RaisePropertyChangedEvent("lisCliente"); }
        }

        //Objeto enlazado para la lista de cliente, utilizando los diferentes filtros
        private List<clases.CLSMAECLIP> _lisFilCli = new List<clases.CLSMAECLIP>();
        public List<clases.CLSMAECLIP> lisFilCli
        {
            get { return _lisFilCli; }
            set { _lisFilCli = value; RaisePropertyChangedEvent("lisFilCli"); }
        }

        //Objeto enlazado para el Combobox de ciudades 
        private List<clases.CLSMAECIUP> _lisBaseCiu = new clases.CLSMAECIUP().listarBaseCiu();
        public List<clases.CLSMAECIUP> lisBaseCiu
        {
            get { return _lisBaseCiu; }
            set { _lisBaseCiu = value; RaisePropertyChangedEvent("lisBaseCiu"); }
        }

        //Objeto enlazado para el Combobox de clientes principales
        private List<clases.CLSMAECLIP> _lisCliPpa = new clases.CLSMAECLIP().listarPpal();
        public List<clases.CLSMAECLIP> lisCliPpa
        {
            get { return _lisCliPpa; }
            set { _lisCliPpa = value; RaisePropertyChangedEvent("lisCliPpa"); }
        }

        //Objeto enlazado para el Combobox de listas de precios
        private List<clases.CLSLISPREP> _lisPre = new clases.CLSLISPREP().listarPre();
        public List<clases.CLSLISPREP> lisPre
        {
            get { return _lisPre; }
            set { _lisPre = value; RaisePropertyChangedEvent("lisPre"); }
        }

        private List<clases.CLSLISPREP> _lisPre2 = new clases.CLSLISPREP().listarPre();
        public List<clases.CLSLISPREP> lisPre2
        {
            get { return _lisPre2; }
            set { _lisPre2 = value; RaisePropertyChangedEvent("lisPre2"); }
        }

        #endregion

        #region metodos

        //------------------------------------------
        public manclien()
        {
            cargarClientes();

            MDOgeneral.conectar();
            strTituloVentana = "Mantenimiento de clientes - Usuario: " + MDOgeneral.usuario + " - [FRMmanclien]";
        }

        private void cargarClientes()
        {
            try
            {
                List<clases.CLSMAECLIP> lisclientes = new clases.CLSMAECLIP().listaCliente();
                _buscarCliente = new VMbuscarGeneral((from cli in lisclientes
                                                      select new
                                                          VMlistaGenerica { strColumna1 = cli.CODCLI_CLI, strColumna2 = cli.NITCLI_CLI, strColumna3 = cli.NOMCLI_CLI }).ToList());
                buscarCliente.PropertyChanged += onBuscarClientePropertyChanged;
                buscarCliente.gridBuscar.columna1.strNombre = "Código";
                buscarCliente.gridBuscar.columna2.strNombre = "Nit           ";
                buscarCliente.gridBuscar.columna3.strNombre = "Nombre                       ";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarClientePropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarCliente.IsOpen)
                    {
                        if (buscarCliente.gridBuscar.selLista != null)
                        {
                            txtCliente.CODCLI_CLI = buscarCliente.gridBuscar.selLista.strColumna1;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarCliente;
        public ICommand cmdBuscarCliente
        {
            get
            {
                if (_cmdBuscarCliente == null)
                {
                    _cmdBuscarCliente = new RelayCommand(r => buscar_cliente());
                }
                return _cmdBuscarCliente;
            }
        }

        private void buscar_cliente()
        {
            try
            {
                buscarCliente.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void listaCliente()
        {
            try
            {
                lisCliente = selCliente.listadodeClientes();
                lisFilCli = lisCliente;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void guardar(WrapPanel wPnot)
        {
            try
            {

                if (txtCliente.EXISTE)
                {
                    if (txtCliente.actualizar() > 0)
                    {
                        txtCliente.CAMBIO = false;
                        lisCliente.Clear();
                        lisCliente = txtCliente.listaCliente();
                        filtrar();
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
                else
                {
                    if (txtCliente.insertar() > 0)
                    {
                        txtCliente.CAMBIO = false;
                        txtCliente.EXISTE = true;
                        lisCliente.Clear();
                        lisCliente = txtCliente.listaCliente();
                        filtrar();
                        new MDOgeneral.notificar(wPnot, "El elemento fue creado satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "El elemento no puede ser creado.", false);
                    }
                }

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void eliminar(WrapPanel wPnot)
        {
            try
            {
                if (txtCliente.eliminar() > 0)
                {
                    txtCliente.CAMBIO = false;
                    lisCliente.Clear();
                    lisCliente = txtCliente.listaCliente();
                    filtrar();
                    new MDOgeneral.notificar(wPnot, "El elemento ha sido eliminado satisfactoriamente.", true);
                }
                else
                {
                    new MDOgeneral.notificar(wPnot, "El elemento no puede ser eliminado.", false);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void filtrar()
        {
            lisFilCli = lisCliente.FindAll(r =>
                r.CODCLI_CLI.ToUpper().Contains(filCliente.CODCLI_CLI.ToUpper()) &
                r.NOMCLI_CLI.ToUpper().Contains(filCliente.NOMCLI_CLI.ToUpper()) &
                r.NOMREP_CLI.ToUpper().Contains(filCliente.NOMREP_CLI.ToUpper()) &
                r.CONTAC_CLI.ToUpper().Contains(filCliente.CONTAC_CLI.ToUpper()) &
                r.DIRCLI_CLI.ToUpper().Contains(filCliente.DIRCLI_CLI.ToUpper()) &
                r.CODCIU_CLI.ToUpper().Contains(filCliente.CODCIU_CLI.ToUpper()) &
                r.NITCLI_CLI.ToUpper().Contains(filCliente.NITCLI_CLI.ToUpper()) &
                r.TEL1CLI_CLI.ToUpper().Contains(filCliente.TEL1CLI_CLI.ToUpper()) &
                r.TEL2CLI_CLI.ToUpper().Contains(filCliente.TEL2CLI_CLI.ToUpper()) &
                r.FAXCLI_CLI.ToUpper().Contains(filCliente.FAXCLI_CLI.ToUpper()) &
                r.PLAZO_CLI.ToUpper().Contains(filCliente.PLAZO_CLI.ToUpper()) &
                r.APLRTE_CLI.ToUpper().Contains(filCliente.APLRTE_CLI.ToUpper()) &
                r.TIPO_CLI.ToUpper().Contains(filCliente.TIPO_CLI.ToUpper()) &
                r.CODLIS_CLI.ToUpper().Contains(filCliente.CODLIS_CLI.ToUpper()) &
                r.CODLISREP_CLI.ToUpper().Contains(filCliente.CODLISREP_CLI.ToUpper()) &
                r.EMAIL_CLI.ToUpper().Contains(filCliente.EMAIL_CLI.ToUpper()) &
                r.CLIPPAL_CLI.ToUpper().Contains(filCliente.CLIPPAL_CLI.ToUpper()) &
                r.ESTADO_CLI.ToUpper().Contains(filCliente.ESTADO_CLI.ToUpper()) &
                r.CLICOM_CLI.ToUpper().Contains(filCliente.CLICOM_CLI.ToUpper()) &
                r.CLIINTERNO_CLI.ToUpper().Contains(filCliente.CLIINTERNO_CLI.ToUpper())
                );
            lisFilCli.Add(new clases.CLSMAECLIP
            {
                CODCLI_CLI = "",
                NOMCLI_CLI = "",
                NOMREP_CLI = "",
                CONTAC_CLI = "",
                DIRCLI_CLI = "",
                CODCIU_CLI = "",
                NITCLI_CLI = "",
                TEL1CLI_CLI = "",
                TEL2CLI_CLI = "",
                FAXCLI_CLI = "",
                PLAZO_CLI = "",
                APLRTE_CLI = "",
                TIPO_CLI = "",
                CODLIS_CLI = "",
                CODLISREP_CLI = "",
                EMAIL_CLI = "",
                CLIPPAL_CLI = "",
                ESTADO_CLI = "",
                CLICOM_CLI = "",
                CLIINTERNO_CLI =""
            });
        }

        public void quiFil()
        {
            filCliente = new clases.CLSMAECLIP
            {
                CODCLI_CLI = "",
                NOMCLI_CLI = "",
                NOMREP_CLI = "",
                CONTAC_CLI = "",
                DIRCLI_CLI = "",
                CODCIU_CLI = "",
                NITCLI_CLI = "",
                TEL1CLI_CLI = "",
                TEL2CLI_CLI = "",
                FAXCLI_CLI = "",
                PLAZO_CLI = "",
                APLRTE_CLI = "",
                TIPO_CLI = "",
                CODLIS_CLI = "",
                CODLISREP_CLI = "",
                EMAIL_CLI = "",
                CLIPPAL_CLI = "",
                ESTADO_CLI = "",
                CLICOM_CLI = "",
                CLIINTERNO_CLI = ""
            };
            lisFilCli = lisCliente.FindAll(r => r.CODCLI_CLI.ToUpper().Contains(filCliente.CODCLI_CLI) &
                r.NOMCLI_CLI.ToUpper().Contains(filCliente.NOMCLI_CLI.ToUpper()) &
                r.NOMREP_CLI.ToUpper().Contains(filCliente.NOMREP_CLI.ToUpper()) &
                r.CONTAC_CLI.ToUpper().Contains(filCliente.CONTAC_CLI.ToUpper()) &
                r.DIRCLI_CLI.ToUpper().Contains(filCliente.DIRCLI_CLI.ToUpper()) &
                r.CODCIU_CLI.ToUpper().Contains(filCliente.CODCIU_CLI.ToUpper()) &
                r.NITCLI_CLI.ToUpper().Contains(filCliente.NITCLI_CLI.ToUpper()) &
                r.TEL1CLI_CLI.ToUpper().Contains(filCliente.TEL1CLI_CLI.ToUpper()) &
                r.TEL2CLI_CLI.ToUpper().Contains(filCliente.TEL2CLI_CLI.ToUpper()) &
                r.FAXCLI_CLI.ToUpper().Contains(filCliente.FAXCLI_CLI.ToUpper()) &
                r.PLAZO_CLI.ToUpper().Contains(filCliente.PLAZO_CLI.ToUpper()) &
                r.APLRTE_CLI.ToUpper().Contains(filCliente.APLRTE_CLI.ToUpper()) &
                r.TIPO_CLI.ToUpper().Contains(filCliente.TIPO_CLI.ToUpper()) &
                r.CODLIS_CLI.ToUpper().Contains(filCliente.CODLIS_CLI.ToUpper()) &
                r.CODLISREP_CLI.ToUpper().Contains(filCliente.CODLISREP_CLI.ToUpper()) &
                r.EMAIL_CLI.ToUpper().Contains(filCliente.EMAIL_CLI.ToUpper()) &
                r.CLIPPAL_CLI.ToUpper().Contains(filCliente.CLIPPAL_CLI.ToUpper()) &
                r.ESTADO_CLI.ToUpper().Contains(filCliente.ESTADO_CLI.ToUpper()) &
                r.CLICOM_CLI.ToUpper().Contains(filCliente.CLICOM_CLI.ToUpper()) &
                r.CLIINTERNO_CLI.ToUpper().Contains(filCliente.CLIINTERNO_CLI.ToUpper()));
        }

        #endregion

        public void consCliente()
        {
            try
            {
                clases.CLSMAECLIP datos = new clases.CLSMAECLIP();
                FRMbuscar frm = new FRMbuscar(datos, "buscar", "Nombre_cliente", "NOMCLI_CLI", "Codigo");
                frm.ShowDialog();
                txtCliente.CODCLI_CLI = frm.retorno;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

    }
}
